package com.yc.blog.jpa;

import java.util.ArrayList;
import java.util.List;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;

import com.yc.entity.Student;
import com.yc.jpa.dao.StudentDao;
import com.yc.jpa.dao.StudentJpqlDao;
import com.yc.jpa.dao.StudentPepositoryDao;

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration("/applicationContext.xml") 
public class SpringJpaTest {

	@Autowired 
    private StudentDao studentDao;
	
	@Autowired 
    private StudentPepositoryDao studentPepositoryDao;
	
	@Autowired 
    private StudentJpqlDao studentJpqlDao;
	
//	@Test
//	public void testMethod() {
//		List<Student> list1 = studentDao.findByNameAndTel("saveTest", "111");
//		System.out.println(list1.get(0).getId());
//	}
//	
//	@Test
//	public void saveTest1() {
//		Student sd = new Student();
//		sd.setName("saveTest");
//		sd.setTel("111");
//		//神奇吧，只用一个空借口就能插入数据，连事务注解都可以不写
//		Student saveEntity = studentPepositoryDao.save(sd);
//		System.out.println("id=" + saveEntity.getId());
//	}
//	
//	/**
//	 * 批量插入<p>
//	 * 一条一条插入，效率并不高
//	 */
//	@Test
//	public void saveTest2() {
//		Student sd1 = new Student();
//		sd1.setName("saveTest2");
//		sd1.setTel("111-1");
//		
//		Student sd2 = new Student();
//		sd2.setName("saveTest2");
//		sd2.setTel("111-2");
//		
//		List<Student> list = new ArrayList<>();
//		list.add(sd1);
//		list.add(sd2);
//		
//		Iterable<Student> res = studentPepositoryDao.save(list);
//	}
//	
//	@Test
//	public void deleteTest1() {
//		studentPepositoryDao.delete(20);
//	}
//	
//	/**
//	 * 这么写并不能根据条件批量删除，执行的结果是先新增一个对象，然后删除这个对象，等于没做。
//	 * 想通过传对象 删除这个对象，只能先find出来，然后再删
//	 */
//	@Test
//	public void deleteTest2_1() {
//		Student sd = new Student();
//		sd.setName("saveTest");
//		sd.setTel("111");
//		studentPepositoryDao.delete(sd);
//	}
//	
//	/**
//	 * 批量删除的写法<p>
//	 * 通过观察打印的sql可以发现 处理效率很低，是一个一个查出来，一个个再删掉
//	 */
//	@Test
//	public void deleteTest2_2() {
//		List<Student> list1 = studentDao.findByNameAndTel("saveTest", "111");
//		studentPepositoryDao.delete(list1);
//	}
//	
//	/**
//	 * 修改，用的还是save方法<p>
//	 * 因为spring-data-jpa基于jpa，在jpa中就是通过修改托管态的值来达到同步修改数据库的目的。
//	 * 所以这里也是同样的道理，不要试图new一个对象，然后自己添加一个id，然后去save
//	 */
//	@Test
//	public void updateTest() {
//		List<Student> list1 = studentDao.findByNameAndTel("saveTest2", "111-1");//托管态
//		Student updateEntity = list1.get(0);
//		updateEntity.setName("saveTest2-update");
//		studentPepositoryDao.save(updateEntity);
//		
//	}
//	
//	/**
//	 * 目的：根据字段名删除
//	 * 这样的写法是会报错的，因为spring-data-jpa没有“内置”
//	 */
//	@Test
//	public void deleteTest() {
////		studentPepositoryDao.deleteByName("saveTest2");
//	}
//	
//	/**
//	 * 简单排序查询
//	 */
//	@Test
//	public void simpleSortFindTest() {
//		Sort sort = new Sort(Sort.Direction.DESC,"id");
//		List<Student> res = studentPepositoryDao.findAll(sort);
//		for (Student std : res) {
//			System.out.println(std.getId() + " -- " + std.getName());
//		}
//	}
//	
//	/**
//	 * 组合排序查询
//	 */
//	@Test
//	public void groupSortFindTest() {
//		List<Sort.Order> order = new ArrayList<>();
//		Sort.Order order1 = new Sort.Order(Sort.Direction.DESC,"id");
//		Sort.Order order2 = new Sort.Order(Sort.Direction.ASC,"date");
//		order.add(order1);
//		order.add(order2);
//		List<Student> res = studentPepositoryDao.findAll(new Sort(order));
//		for (Student std : res) {
//			System.out.println(std.getId() + " -- " + std.getDate() + " -- " + std.getName());
//		}
//		
//	}
//	
//	/**
//	 * 简单分页查询
//	 */
//	@Test
//	public void simplePageFindTest() {
//		//pageNumber（第几页，从第0页开始，别和mysql的limit第一个参数搞混了，那个是第几条数据），pageSize 分页大小
//		PageRequest pageRequest = new PageRequest(1, 5);
//		Page<Student> res = studentPepositoryDao.findAll(pageRequest);
//		List<Student> stdList = res.getContent();
//		for (Student std : stdList) {
//			System.out.println(std.getId() + " -- " + std.getName());
//		}
//	}
//	
//	/**
//	 * 分页和排序结合
//	 */
//	@Test
//	public void pageAndSortTest() {
//		Sort sort = new Sort(Sort.Direction.DESC,"id");
//		PageRequest pageRequest = new PageRequest(0, 5, sort);
//		Page<Student> res = studentPepositoryDao.findAll(pageRequest);
//		System.out.println("totalPages=" + res.getTotalPages());//指的是总共的页数，不是总共的数据条数
//		List<Student> stdList = res.getContent();
//		for (Student std : stdList) {
//			System.out.println(std.getId() + " -- " + std.getName());
//		}
//		
//	}

	/**
	 * 普通查询分页和排序
	 */
	@Test
	public void FindPageAndSortTest() {
		Sort sort = new Sort(Sort.Direction.DESC,"id");
		PageRequest pageRequest = new PageRequest(0, 2, sort);
		Page<Student> res = studentPepositoryDao.findByName("mary", pageRequest);
		System.out.println("totalPages=" + res.getTotalPages());
		List<Student> stdList = res.getContent();
		for (Student std : stdList) {
			System.out.println(std.getId() + " -- " + std.getName());
		}
	}
	
	//-----------------------JPQL---------------------------------------------------------------------
//	@Test
//	public void simpleJpql() {
//		List<Student> list = studentJpqlDao.getStudentByName("mary");
//		for (Student std : list) {
//			System.out.println(std.getId() + " -- " + std.getName());
//		}
//	}
//	
//	/**
//	 * Repository无法完成通过条件批量删除，用jpql可以完成
//	 */
//	@Test
//	public void jpql_delete() {
//		studentJpqlDao.deleteByName("lee");
//	}
//	
//	/**
//	 * Repository无法完成通过条件批量删除，用jpql可以完成
//	 */
//	@Test
//	public void jpql_update() {
//		studentJpqlDao.updateByName(9, "lee");
//	}
//	
//	/**
//	 * 使用jpql分页查询
//	 */
//	@Test
//	public void jpql_page() {
//		Sort sort = new Sort(Sort.Direction.DESC,"id");
//		PageRequest pageRequest = new PageRequest(0, 2, sort);
//		List<Student> list = studentJpqlDao.pageStudentByName("mary", pageRequest);
//		for (Student std : list) {
//			System.out.println(std.getId() + " -- " + std.getName());
//		}
//	
//	}
//	
	
	
}
